import Vue from 'vue'
import VueRouter from 'vue-router'
//************************************** */
import store from '../store/index.js'
import Layout from '@/views/layout.vue'
import { getToken, setToken, removeToken } from '@/utils/auth'

import NProgress from 'nprogress' // progress bar
import 'nprogress/nprogress.css' // progress bar style
NProgress.configure({
  showSpinner: false
}) // 顶部页面加载进度条插件

Vue.use(VueRouter)

// 公共路由
export const constantRoutes = [
  {
    path: '/',
    component: Layout,
    redirect: '/home',
    children: [
      {
        path: '/home',
        component: (resolve) => require(['@/views/home.vue'], resolve),
        name: 'home',
        meta: { title: '首页', icon: 'build', noCache: true, affix: true }
      }
    ]
  },
  {
    path: '/login',
    name: 'login',
    hidden: true,
    component: () => import('../views/login.vue')
  },
  {
    path: '/NotFound',
    name: 'NotFound',
    hidden: true,
    component: () => import('@/views/404.vue')
  }
]
//***************************************************************** */
// // 防止连续点击多次路由报错
// let routerPush = VueRouter.prototype.push
// VueRouter.prototype.push = function push(location) {
//   return routerPush.call(this, location).catch((err) => err)
// }
//***************************************************************** */
const router = new VueRouter({
  mode: 'hash', // 去掉url中的#
  routes: constantRoutes
})
// 路由重置
export function resetRouter() {
  const newRouter = new VueRouter({
    mode: 'hash',
    routes: constantRoutes
  })
  router.matcher = newRouter.matcher // reset router
}
//***************************************************************** */
// 路由白名单
const whiteList = ['/login', '/NotFound']
router.beforeEach(async (to, from, next) => {
  NProgress.start()
  // document.title = to.meta.title;
  if (to.query.url) {
    // removeToken()
    // 清除用户信息，表示子系统退出登录，则门户不得不退出（不然无法进入登录页），此时已打开的门户将也会点击时提示退出
    await store.dispatch('user/resetToken') //如果使用logout，则大客流退出到登录页会调用接口，会报错
  }
  const token = getToken()
  if (token) {
    if (to.path === '/login') {
      next({ path: '/' })
      NProgress.done()
    } else {
      const hasGetUserInfo = store.getters['user/getUserInfo'].userName
      if (hasGetUserInfo && hasGetUserInfo != 'undefined') {
        //信息拿到后，用户请求哪就跳转哪
        next()
      } else {
        try {
          // 如果有令牌，但是没有用户信息，证明用户是第一次登录，通过Vuex设置用户信息
          await store.dispatch('user/getInfo')
          // 根据用户不同，路由表也不同
          const accessRoutes = await store.dispatch('permission/generateRoutes')
          // router.addRoutes(accessRoutes)//vue-router 4.0以下,4.0以上addroutes 已经废弃
          for (let item of accessRoutes) {
            //vue-router 4.0及以上
            router.addRoute(item)
          }
          next({ ...to, replace: true })
        } catch (error) {
          // 如果出错了，把令牌去掉，并让用户重新去到登录页面
          await store.dispatch('user/resetToken')
          console.log(error || 'Has Error')
          next(`/login?redirect=${to.path}`)
          NProgress.done()
        }
      }
    }
  } else {
    if (whiteList.indexOf(to.path) !== -1) {
      next()
    } else {
      // 如果这个页面不在白名单里，直接跳转到登录页面
      next(`/login?redirect=${to.path}`)
      NProgress.done()
    }
  }
})
router.afterEach(() => {
  NProgress.done()
})
export default router
